#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <cassert>

using namespace std;

void PrintPening(sigset_t &pending)
{
    cout << "pid: " << getpid()<<", pending bitmap: ";
    for (int sigo = 31; sigo > 0; sigo--)
    {
        if (sigismember(&pending, sigo))
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }
    cout << endl;
}
int main()
{
    // 屏蔽2号信号
    sigset_t block, oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);
    sigaddset(&block, 2);

    // 真正开始屏蔽
    int n = sigprocmask(SIG_SETMASK, &block, &oblock);
    assert(n == 0);
    cout << "block 2 signal success" << endl;

    while (true)
    {
        // 获取pending 位图
        sigset_t pending;
        sigemptyset(&pending);
        n = sigpending(&pending);
        assert(n == 0);

        // 打印
        PrintPening(pending);
        sleep(1);
    }

    return 0;
}

// void handler(int sig)
// {
//     cout << "get a sig: " << sig <<endl;
//     exit(0);
// }
// int main()
// {
//     signal(SIGSEGV, handler);
//     int *p = nullptr;
//     *p = 100;
//     while(true) sleep(1);

//     return 0;
// }

// void handler(int sig)
// {
//     cout << "get a sig: " << sig <<endl;
//     exit(0);
// }
// int main()
// {
//     signal(SIGFPE, handler);
//     int a=10;
//     a/=0;
//     while(true) sleep(1);

//     return 0;
// }